package main
import (
	"fmt"
	"net"
	"os"
	"io"
)
func main(){
	/*第一步，监听127.0.0.1:8000端口*/
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil{
		fmt.Println("Listen tcp 127.0.0.1:8000  失败，err : ", err)
		return
	}
	fmt.Println("Listen tcp 127.0.0.1:8000  OK")
	
	/*第二步，循环接收客户端信号*/
	for{
		conn, err := listen.Accept()
		if err != nil{
			fmt.Println("Accept err : ", err)
			return
		}
		go manage(conn)
	}
}
/*处理已连接客户端消息*/
func manage(conn net.Conn){
	defer conn.Close()
	
	/*首先，需要接收客户端发来的文件名消息*/
	buf := make([]byte, 1024)
	sum, err := conn.Read(buf)
	if err != nil{
		fmt.Println("Read err : ", err)
		return
	}
	
	filename := string(buf[:sum])	//将文件名存储起来
	
	/*如果接收到了文件名消息，那就向客户端发送OK*/
	sum, err = conn.Write([]byte("OK"))
	if err != nil{
		fmt.Println("Write err : ", err)
		return
	}
	
	f, err2 := os.Create(filename)	//创建一个文件
	if err2 != nil{
		fmt.Println("文件创建失败，err : ", err2)
		return
	}
	defer f.Close()
	
	for{
		sum, err := conn.Read(buf)	//接收来自客户端的数据
		if sum == 0{
			fmt.Println("文件接收完毕！")
			break
		}
		if err != nil{
			if err == io.EOF{
				fmt.Println("文件接收完毕!")
				break
			}
			fmt.Println("文件接收失败, err : ", err)
			return
		}
		f.Write(buf[:sum])	//向文件写入数据
	}
}